package com.eugeneMa.util;

import java.math.BigDecimal;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 数字工具类
 *
 * @author Eugenema
 * @date 2022/4/1 22:56
 */
public class NumberUtil {
    /** 中文数字 */
    private static final String[] CN_NUM = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
    /** 中文数字单位 */
    private static final String[] CN_UNIT = {"", "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千"};
    /** 中文特殊字符：负 */
    private static final String CN_NEGATIVE = "负";
    /** 中文特殊字符：点 */
    private static final String CN_POINT = "点";
    /** 数字正则表达式 */
    private static Pattern pattern = Pattern.compile("-?[0-9]+(\\.[0-9]+)?");

    /**
     * Integer 转 中文数字
     *
     * @author Eugenema
     * @date 2022/4/1 22:24
     *
     * @param num 要转换的整型数
     *
     * @return 中文数字
     **/
    public static String intToChineseNum (Integer num) {
        if (num == null) {
            return CN_NUM[0];
        }
        StringBuffer resultString = new StringBuffer();
        /** 负数标志 */
        boolean isNegative = false;
        if (num < 0) {
            isNegative = true;
            num *= -1;
        }
        /** 位数 */
        int count = 0;
        while (num > 0) {
            resultString.insert(0, CN_NUM[num % 10] + CN_UNIT[count]);
            num /= 10;
            count++;
        }
        if (isNegative) {
            resultString.insert(0, CN_NEGATIVE);
        }

        //除个位外，若为零，应不加单位。及尾数为多个零，则不计等情况
        return resultString.toString().replaceAll("零[千百十]", "零")
                .replaceAll("零+万", "万")
                .replaceAll("零+亿", "亿")
                .replaceAll("零+", "零")
                .replaceAll("零$", "")
                .replaceAll("^一十", "十");
    }

    /**
     * bigDecimal 转 中文数字
     * 整数部分只支持到int的最大值
     *
     * @author Eugenema
     * @date 2022/4/1 22:55
     *
     * @param num 要转换的BigDecimal数
     *
     * @return 中文数字
     **/
    public static String bigDecimalToChineseNum(BigDecimal num) {
        if (num == null) {
            return CN_NUM[0];
        }
        StringBuffer resultString = new StringBuffer();

        //将小数点后面的零给去除
        String numStr = num.abs().stripTrailingZeros().toPlainString();

        //整数与小数分割
        String[] split = numStr.split("\\.");

        //转换整数部分
        String integerStr = intToChineseNum(Integer.parseInt(split[0]));
        resultString.append(integerStr);

        //转换小数部分
        if (split.length == 2) {
            resultString.append(CN_POINT);
            String decimalStr = split[1];
            char[] chars = decimalStr.toCharArray();
            for (int i = 0; i < chars.length; i++) {
                int index = Integer.parseInt(String.valueOf(chars[i]));
                resultString.append(CN_NUM[index]);
            }
        }

        //判断传入数字为正数还是负数
        int symbol = num.signum();
        if (symbol == -1) {
            resultString.insert(0, CN_NEGATIVE);
        }
        return resultString.toString();
    }

    /**
     * 判断是否是数字
     *
     * @author Eugenema
     * @date 2022/1/3 10:53
     *
     * @param str 要判断的字符串
     *
     * @return 若是数字，返回true；反之返回false；若字符串为空，则返回false
     **/
    public static boolean isNumber (String str) {
        if (StringUtil.isEmpty(str)) {
            return false;
        }
        Matcher m = pattern.matcher(str);
        return m.matches();
    }

    public static void main(String[] args) {
        System.out.println(NumberUtil.isNumber("3"));
    }
}
